import { lazyReportBatch } from '../export';

// 保存原始的 window.fetch 方法，以便后续调用
const originalFetch = window.fetch;

/**
 * 重写 window.fetch 方法，用于监控 fetch 请求的性能数据
 */
const overWriteFetch = () => {
  // 重写 window.fetch 方法
  window.fetch = function (url, config) {
    // 记录请求开始时间
    const startTime = Date.now();
    // 初始化性能报告数据对象
    const reportData = {
      // 数据类型为性能监控
      type: 'performance',
      // 子类型为 fetch 请求
      subType: 'fetch',
      // 请求的 URL
      url,
      // 请求开始时间
      startTime,
      // 请求方法
      method: config.method,
      // 请求状态码，初始为 null
      status: null,
      // 请求是否成功，初始为 null
      success: null,
      title: 'fetch请求性能指标',
    };

    // 调用原始的 fetch 方法发起请求
    return originalFetch(url, config)
      .then((res) => {
        // 记录请求结束时间
        const endTime = Date.now();
        // 更新报告数据中的结束时间
        reportData.endTime = endTime;
        // 计算请求持续时间并更新报告数据
        reportData.duration = endTime - startTime;
        // 克隆响应对象，以便后续处理
        const data = res.clone();
        // 更新报告数据中的状态码
        reportData.status = data.status;
        // 更新报告数据中的请求成功标志
        reportData.success = data.ok;
        // 上报性能数据
        lazyReportBatch(reportData);
        return data;
      })
      .catch((err) => {
        // 记录请求结束时间
        const endTime = Date.now();
        // 更新报告数据中的结束时间
        reportData.endTime = endTime;
        // 计算请求持续时间并更新报告数据
        reportData.duration = endTime - startTime;
        // 尝试获取错误状态码，若不存在则默认设置为 0
        reportData.status = err.status || 0;
        // 更新报告数据中的请求成功标志为失败
        reportData.success = false;
        // 上报性能数据
        lazyReportBatch(reportData);
      });
  };
};

/**
 * 导出默认函数，调用该函数可初始化 fetch 方法的重写
 */
export default function fetch() {
  overWriteFetch();
}
